#!/usr/bin/perl -w
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License (the "License").
# You may not use this file except in compliance with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
# Use is subject to license terms.
#

# audit_record_xml [-d] <xml input file>

# audit_record_xml takes the audit record description (.xml file) and
# generates adt_ part of audit_record_attr on stdout.

use auditxml;
use Getopt::Std;
use vars qw($opt_d);
use strict;


our $debug = 0; # normal use is to set via the file being parsed.
               # <debug set="on"/> or <debug set="off"/> or <debug/>
               # if the set attribute is omitted, debug state is toggled
               # Override with appDebug, but toggle won't do what you
               # want.
my $appDebug = 0; # used after return from "new auditxml";

my $prog = $0; $prog =~ s|.*/||g;
my $usage = "usage: $prog [-d] file.xml\n";

getopts('d');

$appDebug = $opt_d;

die $usage if ($#ARGV < 0);

my $doc = new auditxml ($ARGV[0]);  # input XML file

$debug = $appDebug;

foreach my $eventId ($doc->getEventIds) {
	my $event = $doc->getEvent($eventId);
	next if ($event->getOmit eq 'always');
	print "label=$eventId\n";
	my $title = $event->getTitle;
	print "  title=$title\n" if (defined $title && length($title));
	my $program = $event->getProgram;
	if (defined $program && scalar @$program) {
		print "  program=";
		print join(";", @$program);
		print "\n";
	}
	my $see = $event->getSee;
	if (defined $see && scalar @$see) {
		print "  see=";
		print join(";", @$see);
		print "\n";
	}
	my $format = [];
	my $comments = [];
	my $idx = 0;
	my $superClass = $event->getSuperClass;
	$event = $superClass if (defined $superClass && ref($superClass));
	foreach my $entryId ($event->getExternal->getEntryIds) {
		next if $entryId eq 'subject';
		next if $entryId eq 'return';
		my @entry = $event->getExternal->getEntry($entryId);
		my $token = $entry[2];
		my $comment = $entry[4];
		my $opt = $entry[0]->getAttr('opt');
		$token = "[$token]" if ($opt eq 'optional');
		if (defined $comment && ($comment ne '')) {
			$idx++;
			$token .= $idx;
			push @$comments, $comment;
		}
		push @$format, $token;
	}
	if (scalar @$format) {
		print "  format=".join(":", @$format)."\n";
	} else {
		print "  format=user\n";
	}
	my $commentStr = '';
	foreach (@$comments) {
		$commentStr .= "  comment=$_:\n";
	}
	$commentStr =~ s/:\n$/\n/s;
	print $commentStr;
	print "\n";
}

exit (0);

